package clinivida.DAO;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.classic.Session;


public abstract class GenericDAO
{

    protected Session getSession()
    {
        return HibernateUtil.getInstance().getSession();
    }

    public Serializable getPurePojo(String query)
    {
        Session ses = getSession();

        Query q = ses.createQuery(query);
        Object toReturn = q.uniqueResult();

        ses.getTransaction().commit();
        ses.close();
        return (Serializable) toReturn;
    }
    
    @SuppressWarnings("unchecked")
    public < T extends Serializable> List<T> getPureList(Class<T> classToCast, String query, Object... params)
    {
        Session ses = getSession();

        Query q = ses.createQuery(query);
        for(int i = 1; i <= params.length; i++)
        {
            q.setParameter("a"+i, params[i - 1]);
        }

        List<T> toReturn = q.list();

        ses.getTransaction().commit();
        ses.close();
        return toReturn;
    }
    
    protected < T extends Serializable> List<T> inicializeObject(Class<T> classToSearch,List<T> listKey){
        Session ses = getSession();
        List<T> toReturn = new ArrayList<T>();
        for(Serializable object : listKey)
        toReturn.add((T)ses.get(classToSearch, object));
        
        return toReturn;
        
        
    }
    
    

    protected <T extends Serializable> T getPojo(Class<T> classToSearch, Serializable key)
    {
        Session ses = getSession();
        Serializable toReturn = (Serializable) ses.get(classToSearch, key);
        ses.getTransaction().commit();
        ses.close();
        return (T) toReturn;
    }
    
    protected void saveOrUpdate(Serializable ob)
    {
        Session ses = getSession();
        ses.saveOrUpdate(ob);
        ses.getTransaction().commit();
        ses.close();
    }

    protected void remove(Serializable ob)
    {
        Session ses = getSession();
        ses.delete(ob);
        ses.getTransaction().commit();
        ses.close();
    }

}
